package com.miku.blog.utils;

import com.miku.blog.domain.pojo.SystemConstance;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @author shkstart
 * @create ${}YEAR-05-26 20:56
 */
public class DateUtils {

    /**
     * 将日期格式转化为 "yyyy-MM-dd" 格式的字符串
     * @param date
     * @return
     */
    public static String format(Date date){
        String format = getSimpleDateFormat().format(date);
        return format;
    }

    /**
     * 将格式为 "yyyy-MM-dd" 的字符串 转换成日期
     * @param date
     * @return
     */
    public static Date parse(String date){
        Date parse = null;
        try {
            parse = getSimpleDateFormat().parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return parse;
    }


    /**
     * 将格式为 "yyyy年MM月dd日 HH时mm分ss秒" 的字符串 转换成日期
     * @param date
     * @return
     */
    public static Date parseToCN(String date){
        Date parse = null;
        try {
            parse = getSimpleDateFormatByCN().parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return parse;
    }




    /**
     * 将日期格式 为"yyyy-MM-dd" 的字符串
     *
     * 转换成 "yyyy-MM-dd HH:mm:ss"格式的日期
     *
     * @param format
     * @return
     */
    public static Date parseYMDHMS(String format,String append){
        SimpleDateFormat simpleDateFormat = getSimpleDateFormatYMDHMS();
        Date date = null;
        try {
            if (format.indexOf(" ") != -1){
                format = format.substring(0,format.indexOf(" "));
            }
            if (append.indexOf(" ") == -1){
                append = " " + append;
            }
            String finalFormat = format + append;
            date = simpleDateFormat.parse(finalFormat);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }


    /**
     * 获取昨天 的凌晨(00:00:00) 的时间日期
     * @return
     */
    public static Date getDateByYesterday(){
        int dayTime = 24 * 60 * 60 * 1000;
        Date todayMorning = getDateByTodayMorning();
        Date yesterday = new Date(todayMorning.getTime() - dayTime);
        return yesterday;
    }

    /**
     * 获取当天 凌晨(00:00:00) 的时间日期
     * @return "yyyy-MM-dd 00:00:00"
     */
    public static Date getDateByTodayMorning(){
        SimpleDateFormat simpleDateFormat = getSimpleDateFormatYMDHMS();
        Date date = new Date();
        String format = simpleDateFormat.format(date);
        String append = " 00:00:00";
        Date parse = parseYMDHMS(format,append);
        return parse;
    }

    /**
     * 获取当天 夜晚(23:59:59) 的时间日期
     * @return "yyyy-MM-dd 23:59:59"
     */
    public static Date getDateByTodayNight(){
        SimpleDateFormat simpleDateFormat = getSimpleDateFormatYMDHMS();
        Date date = new Date();
        String format = simpleDateFormat.format(date);
        String append = "23:59:59";
        Date parse = parseYMDHMS(format,append);
        return parse;
    }

    /**
     * 获取距离今天的 前一周的时间
     *
     * 例: 2022-05-27 15：23：13  >>>>> 2022-05-21 00:00:00
     * @return
     */
    public static Date getDateAtWeekBeforeToday(){
        Date night = getDateByTodayNight();    // yyyy-MM-dd 23:59:59
        long weekMillis = SystemConstance.WEEK_FOR_MILLISECONDS; // 7 * 24 * 60 * 60 * 1000
        Date date = new Date(night.getTime() + (1 * 1000) - weekMillis);//(1 * 1000) + 23:59:59 >> 00:00:00
        return date;
    }



    public static SimpleDateFormat getSimpleDateFormat(){
        return new SimpleDateFormat("yyyy-MM-dd");
    }

    /**
     * 获取一个日期格式   格式 为"yyyy-MM-dd HH:mm:ss"
     * @return
     */
    public static SimpleDateFormat getSimpleDateFormatYMDHMS(){
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 获取一个日期格式   格式 为"yyyyMMddHHmmss"
     * @return
     */
    public static SimpleDateFormat getSimpleDateFormatNo(){
        return new SimpleDateFormat("yyyyMMddHHmmss");
    }


    /**
     * 获取一个日期格式   格式 为"yyyy年MM月dd日 HH时mm分ss秒"
     * @return
     */
    public static SimpleDateFormat getSimpleDateFormatByCN(){
        return new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
    }



    //生成距离今天近一周的时间(日期格式为字符串:yyyy-MM-dd)列表
    public static List<String> generateOneWeekDateFormatList(){
        int dayTime = 24 * 60 * 60 * 1000;
        Date seven = getDateAtWeekBeforeToday();
        Date six = new Date(seven.getTime() + 1 * dayTime);
        Date five = new Date(seven.getTime() + 2 * dayTime);
        Date four = new Date(seven.getTime() + 3 * dayTime);
        Date third = new Date(seven.getTime() + 4 * dayTime);
        Date two = new Date(seven.getTime() + 5 * dayTime);
        Date today = new Date(seven.getTime() + 6 * dayTime);
        return Arrays.asList(format(seven),format(six),format(five),format(four),format(third),format(two),format(today));
    }

}
